#pragma once

#include "storage_device.h"
#include "storage_errors.h"
#include <vector>
#include <memory>
#include <functional>
#include <string_view>
#include "base_noncopyable.h"

namespace El {
namespace Storage {

/**
 * @brief 存储管理器类
 *
 * 负责管理系统中的所有存储设备，提供设备枚举、监控和管理功能
 */

// 回调函数类型定义
using StorageEventCallback = std::function<void(std::shared_ptr<IStorageDevice>, DeviceStatus)>;
class IStorageManager {
public:
    virtual ~IStorageManager() = default;

    /**
     * @brief 获取存储管理器单例
     * @return IStorageManager& 存储管理器实例
     */
    static IStorageManager &GetInstance();

    /**
     * @brief 启动存储管理器
     * @return bool 操作是否成功
     */
    virtual bool Start() = 0;

    /**
     * @brief 停止存储管理器
     */
    virtual void Stop() = 0;

    /**
     * @brief 获取指定设备
     * @param devicePath 设备路径
     * @return std::shared_ptr<IStorageDevice> 设备实例，如果不存在返回nullptr
     */
    virtual std::shared_ptr<IStorageDevice> GetDevice(std::string_view devicePath) = 0;

    /**
     * @brief 移除存储设备
     * @param devicePath 设备路径
     * @return bool 操作是否成功
     */
    virtual bool RemoveDevice(std::string devicePath) = 0;

    /**
     * @brief 获取总容量信息
     * @return StorageCapacity 总容量信息
     */
    virtual StorageCapacity GetTotalCapacity() const = 0;

    /**
     * @brief 清理空间
     * @param requiredBytes 需要清理的字节数
     * @return bool 操作是否成功
     */
    virtual bool CleanupSpace(uint64_t requiredBytes) = 0;

    /**
     * @brief 注册存储事件回调
     * @param callback 回调函数
     * @return uint32_t 回调ID
     */
    virtual uint32_t RegisterStorageEventCallback(StorageEventCallback callback) = 0;

    /**
     * @brief 注销存储事件回调
     * @param callbackId 回调ID
     * @return bool 操作是否成功
     */
    virtual bool UnregisterStorageEventCallback(uint32_t callbackId) = 0;

    /**
     * @brief 获取默认U盘挂载状态
     * @return bool 操作是否成功
     */
    virtual bool GetDefaultUdiskStatus(DeviceStatus &status) = 0;
};

} // namespace Storage
} // namespace El
